---
dimensions:
  type:
    primary: implementation
    detail: advanced
  level: intermediate
standard_title: Reverse Invocation App
language: en
title: App
description: This document details how plugins can reverse invoke App services within
  the Dify platform. It covers three types of interfaces Chat interface (for Chatbot/Agent/Chatflow
  applications), Workflow interface, and Completion interface, providing entry points,
  invocation specifications, and practical code examples for each.
---

Reverse invoking an App means that a plugin can access data from an App within Dify. This module supports both streaming and non-streaming App calls. If you are unfamiliar with the basic concepts of reverse invocation, please first read [Reverse Invocation of Dify Services](/plugin_dev_en/9241-reverse-invocation.en.mdx).

**Interface Types:**

*   For `Chatbot/Agent/Chatflow` type applications, they are all chat-based applications and thus share the same input and output parameter types. Therefore, they can be uniformly treated as the **Chat Interface.**
*   For Workflow applications, they occupy a separate **Workflow Interface.**
*   For Completion (text generation application) applications, they occupy a separate **Completion Interface**.

Please note that plugins are only allowed to access Apps within the Workspace where the plugin resides.

### Calling the Chat Interface

#### **Entry Point**

```python
    self.session.app.chat
```

#### **Interface Specification**

```python
    def invoke(
        self,
        app_id: str,
        inputs: dict,
        response_mode: Literal["streaming", "blocking"],
        conversation_id: str,
        files: list,
    ) -> Generator[dict, None, None] | dict:
        pass
```

When `response_mode` is `streaming`, this interface will directly return `Generator[dict]`. Otherwise, it returns `dict`. For specific interface fields, please refer to the return results of `ServiceApi`.

#### **Use Case**

We can call a Chat type App within an `Endpoint` and return the result directly.

```python
import json
from typing import Mapping
from werkzeug import Request, Response
from dify_plugin import Endpoint

class Duck(Endpoint):
    def _invoke(self, r: Request, values: Mapping, settings: Mapping) -> Response:
        """
        Invokes the endpoint with the given request.
        """
        app_id = values["app_id"]

        def generator():
            # Note: The original example incorrectly called self.session.app.workflow.invoke
            # It should call self.session.app.chat.invoke for a chat app.
            # Assuming a chat app is intended here based on the section title.
            response = self.session.app.chat.invoke(
                app_id=app_id, 
                inputs={}, # Provide actual inputs as needed
                response_mode="streaming", 
                conversation_id="some-conversation-id", # Provide a conversation ID if needed
                files=[]
            )

            for data in response:
                yield f"{json.dumps(data)} <br>"

        return Response(generator(), status=200, content_type="text/html")
```

### Calling the Workflow Interface

#### **Entry Point**

```python
    self.session.app.workflow
```

#### **Interface Specification**

```python
    def invoke(
        self,
        app_id: str,
        inputs: dict,
        response_mode: Literal["streaming", "blocking"],
        files: list,
    ) -> Generator[dict, None, None] | dict:
        pass
```

### Calling the Completion Interface

#### **Entry Point**

```python
    self.session.app.completion
```

**Interface Specification**

```python
    def invoke(
        self,
        app_id: str,
        inputs: dict,
        response_mode: Literal["streaming", "blocking"],
        files: list,
    ) -> Generator[dict, None, None] | dict:
        pass
```

## Related Resources

- [Reverse Invocation of Dify Services](/plugin_dev_en/9241-reverse-invocation.en.mdx) - Understand the fundamental concepts of reverse invocation
- [Reverse Invocation Model](/plugin_dev_en/9242-reverse-invocation-model.en.mdx) - Learn how to call model capabilities within the platform
- [Reverse Invocation Tool](/plugin_dev_en/9242-reverse-invocation-tool.en.mdx) - Learn how to call other plugins
- [Develop a Slack Bot Plugin](/plugin_dev_en/0432-develop-a-slack-bot-plugin.en.mdx) - A practical application case using reverse invocation
- [Develop Extension Plugins](/plugin_dev_en/9231-extension-plugin.en.mdx) - Learn how to develop extension plugins

{/*
Contributing Section
DO NOT edit this section!
It will be automatically generated by the script.
*/}

<CardGroup cols="2">
    <Card
        title="Edit this page"
        icon="pen-to-square"
        href="https://github.com/alterxyz/dify-docs-plugin-dev/edit/main/plugin_dev_en/9242-reverse-invocation-app.en.mdx"
    >
        Help improve our documentation by contributing directly
    </Card>
    <Card
        title="Report an issue"
        icon="github"
        href="https://github.com/alterxyz/dify-docs-plugin-dev/issues/new?title=Documentation%20Issue%3A%20reverse-invocation-app&body=%23%23%20Issue%20Description%0A%3C%21--%20Please%20briefly%20describe%20the%20issue%20you%20found%20--%3E%0A%0A%23%23%20Page%20Link%0Ahttps%3A%2F%2Fgithub.com%2Falterxyz%2Fdify-docs-plugin-dev%2Fblob%2Fmain%2Fplugin_dev_en%2F9242-reverse-invocation-app.en.mdx%0A%0A%23%23%20Suggested%20Changes%0A%3C%21--%20If%20you%20have%20specific%20suggestions%20for%20changes%2C%20please%20describe%20them%20here%20--%3E%0A%0A%3C%21--%20Thank%20you%20for%20helping%20improve%20our%20documentation%21%20--%3E"
    >
        Found an error or have suggestions? Let us know
    </Card>
</CardGroup>
